package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.MarcaDAO;
import mx.ipn.persistencia.dao.SubmarcaDAO;
import mx.ipn.to.SubmarcaTO;

public class SubmarcaDAOMySQL implements SubmarcaDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(SubmarcaDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO submarca (nombre,id_marca,activo) VALUES(?,?,?)";
	private static final String DESACTIVA = "DELETE FROM submarca WHERE id_submarca=?";
	private static final String UPDATE = "UPDATE submarca SET nombre=?,id_marca=?,activo=? WHERE id_submarca=?";
	private static final String FINDBYID = "SELECT * FROM submarca WHERE id_submarca=?";
	private static final String FINDBYNOMBREMARCA = "SELECT * FROM submarca WHERE nombre=? and id_marca=?";
	private static final String SELECT = "SELECT * FROM submarca";
	private static final String SELECTACTIVO = "SELECT * FROM submarca WHERE activo=true";
	private static final String SELECTBYMARCA = "SELECT * FROM submarca WHERE id_marca=?";
	private static final String SELECTACTIVOBYMARCA = "SELECT * FROM submarca WHERE id_marca=?";

	@Override
	public short DesactivaSubmarca(int idSubmarca) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(DESACTIVA);

			ps.setInt(1, idSubmarca);

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			}

			else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

	@Override
	public SubmarcaTO findSubmarcaById(int idSubmarca) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);

			ps.setInt(1, idSubmarca);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {

				// Crea la fabrica especifica de MySQL
				FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
						.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
				// Crea un DAO para la tabla TIPOEMPLEADO
				MarcaDAO marcaDAO = fabricaMySQL.getMarcaDAO();

				SubmarcaTO submarcaTO = new SubmarcaTO(idSubmarca, rs
						.getString("nombre"), marcaDAO.findMarcaById(rs
						.getShort("id_marca")), rs.getBoolean("activo"));

				ps.close();
				conexion.close();
				return submarcaTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public SubmarcaTO findSubmarcaByNombreMarca(String nombre, short idMarca) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYNOMBREMARCA);

			ps.setString(1, nombre);
			ps.setShort(2, idMarca);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {

				// Crea la fabrica especifica de MySQL
				FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
						.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
				// Crea un DAO para la tabla TIPOEMPLEADO
				MarcaDAO marcaDAO = fabricaMySQL.getMarcaDAO();

				SubmarcaTO submarcaTO = new SubmarcaTO(
						rs.getInt("id_submarca"), rs.getString("nombre"),
						marcaDAO.findMarcaById(rs.getShort("id_marca")), rs
								.getBoolean("activo"));

				ps.close();
				conexion.close();
				return submarcaTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public boolean insertSubmarca(SubmarcaTO submarcaTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setString(1, submarcaTO.getNombre());
			ps.setShort(2, submarcaTO.getMarcaTO().getIdMarca());
			ps.setBoolean(3, submarcaTO.getActivo());
			ps.executeUpdate();

			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	@Override
	public ArrayList<SubmarcaTO> selectActivoSubmarca() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			MarcaDAO marcaDAO = null;

			ArrayList<SubmarcaTO> submarcaTO = null;
			SubmarcaTO submarcaTO2 = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTACTIVO);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (submarcaTO == null) {
					submarcaTO = new ArrayList<SubmarcaTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					marcaDAO = fabricaMySQL.getMarcaDAO();
				}

				submarcaTO2 = new SubmarcaTO(rs.getInt("id_submarca"), rs
						.getString("nombre"), marcaDAO.findMarcaById(rs
						.getShort("id_marca")), rs.getBoolean("activo"));

				submarcaTO.add(submarcaTO2);
			}
			ps.close();
			conexion.close();
			return submarcaTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public SubmarcaTO selectActivoSubmarcaByMarca(short idMarca) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			MarcaDAO marcaDAO = null;

			ArrayList<Integer> listIdSubmarca = null;
			ArrayList<String> listNombre = null;
			ArrayList<Boolean> listActivo = null;

			SubmarcaTO submarcaTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTACTIVOBYMARCA);
			ps.setShort(1, idMarca);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdSubmarca == null) {

					listIdSubmarca = new ArrayList<Integer>();
					listNombre = new ArrayList<String>();
					listActivo = new ArrayList<Boolean>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					marcaDAO = fabricaMySQL.getMarcaDAO();
				}

				listIdSubmarca.add(rs.getInt("id_submarca"));
				listNombre.add(rs.getString("nombre"));
				listActivo.add(rs.getBoolean("activo"));
			}
			if (listIdSubmarca != null) {
				
				Integer[] arrIdSubmarca = (Integer[])listIdSubmarca.toArray(new Integer[listIdSubmarca.size()]);
				String[] arrNombre = (String[])listNombre.toArray(new String[listNombre.size()]);
				Boolean[] arrActivo = (Boolean[])listActivo.toArray(new Boolean[listActivo.size()]);
				
				submarcaTO = new SubmarcaTO(arrIdSubmarca, arrNombre,
						marcaDAO.findMarcaById(idMarca), arrActivo);
			}
			ps.close();
			conexion.close();
			return submarcaTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<SubmarcaTO> selectSubmarca() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			MarcaDAO marcaDAO = null;

			ArrayList<SubmarcaTO> submarcaTO = null;
			SubmarcaTO submarcaTO2 = null;

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (submarcaTO == null) {
					submarcaTO = new ArrayList<SubmarcaTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					marcaDAO = fabricaMySQL.getMarcaDAO();
				}

				submarcaTO2 = new SubmarcaTO(rs.getInt("id_submarca"), rs
						.getString("nombre"), marcaDAO.findMarcaById(rs
						.getShort("id_marca")), rs.getBoolean("activo"));

				submarcaTO.add(submarcaTO2);
			}
			ps.close();
			conexion.close();
			return submarcaTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public SubmarcaTO selectSubmarcaByMarca(short idMarca) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			MarcaDAO marcaDAO = null;

			ArrayList<Integer> listIdSubmarca = null;
			ArrayList<String> listNombre = null;
			ArrayList<Boolean> listActivo = null;

			SubmarcaTO submarcaTO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTBYMARCA);
			ps.setShort(1, idMarca);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdSubmarca == null) {

					listIdSubmarca = new ArrayList<Integer>();
					listNombre = new ArrayList<String>();
					listActivo = new ArrayList<Boolean>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					marcaDAO = fabricaMySQL.getMarcaDAO();
				}

				listIdSubmarca.add(rs.getInt("id_submarca"));
				listNombre.add(rs.getString("nombre"));
				listActivo.add(rs.getBoolean("activo"));
			}
			if (listIdSubmarca != null) {
				
				Integer[] arrIdSubmarca = (Integer[])listIdSubmarca.toArray(new Integer[listIdSubmarca.size()]);
				String[] arrNombre = (String[])listNombre.toArray(new String[listNombre.size()]);
				Boolean[] arrActivo = (Boolean[])listActivo.toArray(new Boolean[listActivo.size()]);
				
				submarcaTO = new SubmarcaTO(arrIdSubmarca, arrNombre,
						marcaDAO.findMarcaById(idMarca), arrActivo);
			}
			ps.close();
			conexion.close();
			return submarcaTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}

	}

	@Override
	public short updateSubmarca(SubmarcaTO submarcaTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);
			ps.setString(1, submarcaTO.getNombre());
			ps.setShort(2, submarcaTO.getMarcaTO().getIdMarca());
			ps.setBoolean(3, submarcaTO.getActivo());
			ps.setInt(4, submarcaTO.getIdSubmarca());
			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

}
